package middle;

/**
 * 实现一个循环队列
 * @author 胡宇轩
 * @Email: yuxuan.hu01@bianlifeng.com
 */
public class DesignCircularQueue {

    class MyCircularQueue {
        int[] data;
        int head = -1;
        int tail = -1;
        int length;
        int capacity;
        /**
         * 构造器，设置队列长度为 k 。
         * */
        public MyCircularQueue(int k) {
            capacity = k;
            this.data = new int[capacity];
        }

        /**
         * 向循环队列插入一个元素。如果成功插入则返回真。
         * */
        public boolean enQueue(int value) {
            if(isFull()){
                return false;
            }
            // the first element
            if(isEmpty()){
                head = 0;
            }
            tail = (tail + 1) % capacity;
            data[tail] = value;
            length++;
            return true;
        }

        /**
         * 从循环队列中删除一个元素。如果成功删除则返回真
         * */
        public boolean deQueue() {
            if(isEmpty()){
                return false;
            }
            /**
             * 当只有一个元素的时候，head 和 tail 相等。
             * */
            if (head == tail) {
                head = -1;
                tail = -1;
                length--;
                return true;
            }
            head = (head + 1) % capacity;
            length--;
            return true;
        }

        /**
         * 从队首获取元素。如果队列为空，返回 -1 。
         * */
        public int Front() {
            if(isEmpty()){
                return -1;
            }
            return data[head];
        }

        /**
         * 获取队尾元素。如果队列为空，返回 -1 。
         * */
        public int Rear() {
            if(isEmpty()){
                return -1;
            }
            return data[tail];
        }

        /**
         * 检查队列是否为空
         * */
        public boolean isEmpty() {
            return length == 0;
        }

        /**
         * 检查队列是否满了
         * */
        public boolean isFull() {
            return length==capacity;
        }
    }
}
